home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / graphics / fpoly256.zip / FBXBLIT.ASM < prev    next >
Assembly Source File  |  1991-12-17  |  7KB  |  339 lines

  1.     TITLE    FPBLIT - Fast poly filling blitter
  2.     NAME    FPBLIT
  3.  
  4.  
  5.     COMMENT    $
  6.  
  7.     Name:        FPBLIT
  8.  
  9.         Written and (c) by Dave Stampe 9/11/91
  10.         Not for commercial use, so get permission
  11.         before marketing code using this stuff!
  12.         For private PD use only.
  13.  
  14.         $
  15.  
  16.     COMMENT    $
  17.  
  18.     Name:        tpoly
  19.  
  20.     Caller:        C:
  21.  
  22.             int tpoly(int x1, int x2, long l_incr, long r_incr,
  23.                   int y1, int y3, int hold);
  24.  
  25.             x1 = left side start, x2 = right side start
  26.              if 0x8000, uses end of last poly's side for cont.
  27.             y1 = top, y2 = 1+bottom of poly slice
  28.             l_incr, r_incr = 2^16 times slope (add to x each line)
  29.             hold: 0 = normal, 1 = make sure left is OK
  30.                       2 = make sure right is OK
  31.                       (for continuation)
  32.  
  33.         $
  34.  
  35.  
  36.         .MODEL large
  37.  
  38.         .CODE
  39.                 ; big table more eff. than masking
  40.                 ; start byte lookup table
  41. stmask:        REPT    80
  42.         db    15,14,12,8
  43.         ENDM
  44.                 ; end byte lookup table
  45. fnmask:         REPT    80
  46.         db      1,3,7,15
  47.         ENDM
  48.  
  49.  
  50. x1    equ    [bp+6]          ; arguments to _tpoly
  51. x2    equ    [bp+8]
  52. l_incr    equ    [bp+10]
  53. r_incr    equ    [bp+14]
  54. y1    equ    [bp+18]
  55. y3    equ    [bp+20]
  56. hold    equ    [bp+22]
  57.  
  58. vline   equ    [bp-2]       ; video base addr. of line
  59. lines    equ    [bp-4]        ; number of lines to fill
  60. clipped    equ    [bp-6]        ; flags clipped poly (needs end recalc)
  61. aswap    equ    [bp-8]
  62.  
  63.     extrn    _l_hold         ; holds full res. L, R. point
  64.     extrn    _r_hold
  65.  
  66.     extrn    _t_clip         ; clipping rect. sides
  67.     extrn    _b_clip
  68.     extrn    _l_clip
  69.     extrn    _r_clip
  70.  
  71.     extrn    _dpaddr        ; page base address
  72.  
  73.    ;
  74.    ;    tpoly(int x1,int x2, long l_incr, long r_incr,
  75.    ;                 int y1, int y3, int hold)
  76.    ;
  77.  
  78.         PUBLIC    _tpoly
  79.  
  80. _tpoly    proc    far
  81.  
  82.     .386
  83.     push    bp
  84.     mov    bp,sp
  85.     sub    sp,8
  86.     push    si
  87.     push    di
  88.  
  89.     mov    word ptr clipped,0
  90.  
  91.     mov    ax,word ptr y3           ; if(y3-y1<1)return(-1);
  92.     sub    ax,word ptr y1
  93.     cmp    ax,1
  94.     jge    short continue
  95.  
  96.     mov    ax,65535               ; return -1 on bad args
  97.     jmp    exit
  98.  
  99. continue:
  100.     mov    ax,03c5h        ; setup DX adr. swap value
  101.     mov    aswap,ax
  102.     cld
  103.     mov    ax,0a000h              ; set video segment
  104.     mov    es,ax
  105.  
  106.     mov    edx,DWORD PTR ds:_l_hold
  107.     mov    ax,x1
  108.     cmp    ax,8000h               ; old or new left side
  109.     je    short nlload
  110.     mov    dx,ax
  111.     shl    edx,16
  112.     add    edx,08000h             ; force left side to round up
  113. nlload:
  114.     mov    esi,DWORD PTR ds:_r_hold
  115.     mov    ax,x2
  116.     cmp    ax,8000h               ; old or new right
  117.     je    short nrload
  118.     mov    si,ax
  119.     shl    esi,16
  120. nrload:
  121.     mov    bx,y1
  122.     cmp    bx,WORD PTR ds:_b_clip   ; trivial vertical clip tests
  123.     jg    clipall
  124.     mov    ax,y3
  125.     cmp    ax,WORD PTR ds:_t_clip
  126.     jle    short clipall
  127.     cmp    ax,WORD PTR ds:_b_clip    ; test if next-slice update
  128.     jl    short okbot               ; will be require
  129.     inc    WORD PTR clipped
  130.     mov    ax,WORD PTR ds:_b_clip
  131.     mov    y3,ax
  132. okbot:
  133.                     ; test if top needs clipping
  134.     sub    bx,WORD PTR ds:_t_clip
  135.     jge    short oktop
  136.     mov    ax,WORD PTR ds:_t_clip
  137.     mov    y1,ax
  138.     neg    bx                      ; adjust left, right sides for
  139.     movzx    ebx,bx                  ; top of screen
  140.  
  141.     push    edx
  142.     mov    eax,DWORD PTR r_incr    ;advance right top
  143.     imul    eax,ebx
  144.     add    esi,eax
  145.  
  146.     mov    eax,DWORD PTR l_incr    ; advance left top
  147.     imul    eax,ebx
  148.     pop    edx
  149.     add    edx,eax
  150.  
  151. oktop:
  152.     mov    ax,y3                   ; compute # lines
  153.     sub    ax,y1
  154.     jle    short clipall           ; bad clip trap
  155.  
  156.     mov    lines,ax
  157.     mov    al,y1
  158.     mov    bl,80                   ; compute starting line adr
  159.     mul    bl
  160.     add    ax,WORD PTR ds:_dpaddr
  161.     mov    vline,ax
  162.  
  163.     mov    ebx,edx                 ; convert fixed-pt to integer
  164.     sar    ebx,16
  165.     mov    ecx,esi
  166.     sar    ecx,16
  167.     jl    short doneline          ; preclip left trap
  168.  
  169.     cmp    bx,WORD PTR ds:_l_clip  ; clip left
  170.     jge    short iclipl
  171.     mov    bx,WORD PTR ds:_l_clip
  172.  
  173. iclipl:
  174.     cmp    cx,WORD PTR ds:_r_clip  ; clip right
  175.     jle    short nextline
  176.     mov    cx,WORD PTR ds:_r_clip
  177.     jmp    short nextline
  178.  
  179. clipall:
  180.     inc    WORD PTR clipped        ; mark as clipped (none showing)
  181.     jmp    donetri
  182.  
  183. nextline:
  184.         ; start of fast h line blitter:
  185.         ;  bx=left side, cx=right side, vline=line start
  186.  
  187.     xchg    dx,aswap
  188.  
  189.     mov    al,BYTE PTR cs:[bx+stmask]  ; left mask
  190.     shr    bx,2                        ; left address
  191.  
  192.     mov    di,cx
  193.     mov    ah,BYTE PTR cs:[di+fnmask]  ; right mask
  194.     shr    cx,2                        ; right address
  195.  
  196.     mov    di,vline            ; start address
  197.     add    di,bx
  198.     sub    cx,bx                       ; number of bytes-1
  199.     je    short onebyte
  200.     jc    short doneline              ; clip trap
  201.  
  202.     out    dx,al
  203.     stosb                            ; mask first byte
  204.     dec    cx                          ; mask rest
  205.     mov    al,0ffh                     ; rep faster than test and jmp
  206.     out    dx,al
  207.     rep    stosb
  208.  
  209.     mov    al,ah
  210.     out    dx,al
  211.     mov    es:[di],ah                  ; mask last byte
  212.     jmp    short doneline
  213.  
  214. onebyte:
  215.     and    al,ah
  216.     out    dx,al
  217.     mov    es:[di],al        ; single byte mask
  218.  
  219. doneline:
  220.     xchg    dx,aswap
  221.     add    edx,DWORD PTR l_incr    ; step left, right edges
  222.     add    esi,DWORD PTR r_incr
  223.  
  224.     dec    WORD PTR lines          ; done lines?
  225.     jle    short donetri
  226.     mov    ax,80                   ; next line address
  227.     add    vline,ax
  228.  
  229.     mov    ebx,edx            ; convert fixed pt to integer
  230.     sar    ebx,16
  231.     mov    ecx,esi
  232.     sar    ecx,16
  233.     jl    short doneline          ; left preclip
  234.     cmp    bx,WORD PTR ds:_l_clip  ; clip left edge
  235.     jge    short nclipl
  236.     mov    bx,WORD PTR ds:_l_clip
  237.  
  238. nclipl:
  239.     cmp    cx,WORD PTR ds:_r_clip  ; clip right edge
  240.     jle    short nextline
  241.     mov    cx,WORD PTR ds:_r_clip
  242.     jmp    nextline
  243.  
  244. donetri:                                ; finished all drawing
  245.     mov    edi,edx
  246.     test    WORD PTR hold,0ffh      ; check if L,R pos'ns need
  247.     je    short nofixup           ; fixing because of clipping
  248.     test    WORD PTR clipped, 0ffh
  249.     je    short nofixup
  250.  
  251.     mov    bx,y3                   ; number of lines vertically
  252.     sub    bx,y1
  253.     movzx    ebx,bx
  254.  
  255.     test    WORD PTR hold,2        ; right update needed?
  256.     je    short nofixrt           ; (use hold flags as this is an
  257.     mov    eax,DWORD PTR r_incr    ;  expensive operation)
  258.     imul    eax,ebx
  259.     mov    si,x1
  260.     shl    esi,16
  261.     cmp    esi,80000000h              ; add to old edge or new edge?
  262.     jne    short rlold
  263.     mov    esi,DWORD PTR ds:_r_hold
  264. rlold:
  265.     add    esi,eax
  266.  
  267. nofixrt:
  268.     test    WORD PTR hold,1            ; left update needed?
  269.     je    short nofixup
  270.     mov    eax,DWORD PTR l_incr
  271.     imul    eax,ebx
  272.     mov    di,x2
  273.     shl    edi,16
  274.     add    edi,8000h
  275.     cmp    edi,80008000h              ; add to old or new edge?
  276.     jne    short llold
  277.     mov    edi,DWORD PTR ds:_l_hold
  278. llold:
  279.     add    edi,eax
  280.  
  281. nofixup:
  282.     mov    DWORD PTR ds:_l_hold,edi   ; store edge points in case
  283.     mov    DWORD PTR ds:_r_hold,esi   ; needed for next poly slice
  284. exit:
  285.     pop    di                         ; exit code
  286.     pop    si
  287.     mov    sp,bp
  288.     pop    bp
  289.     ret
  290.  
  291. _tpoly    endp
  292.  
  293.  
  294.    ;
  295.    ;    long compute_slope(int x1, int y1, int x2, int y2)
  296.    ;
  297.  
  298. y1    equ    [bp+8]
  299. y2    equ    [bp+12]
  300. x1    equ    [bp+6]
  301. x2    equ    [bp+10]
  302.  
  303.     PUBLIC    _compute_slope
  304.  
  305. _compute_slope    proc    far
  306.  
  307.     push    bp        ; computes slope (dy incrementor)
  308.     mov    bp,sp           ; with 16-bit underflow
  309.     sub    sp,4
  310.     .386
  311.     xor    ecx,ecx
  312.     mov    cx,y2
  313.     sub    cx,y1
  314.     je    short @5@386    ; skip if zero divide (special case)
  315.     mov    ax,x2           ; detected later by y1==y2 test
  316.     sub    ax,x1
  317.     cwd
  318.     movsx    eax,ax      ; (x2-x1)/(y2-y1)
  319.     movsx    edx,dx
  320.     shl    eax,16
  321.     idiv    ecx
  322.     cmp        eax,0       ; round up if pos (neg already rounded up)
  323.     jle    short @5@386
  324.     inc    eax
  325. @5@386:                         ; return long value (286 style)
  326.     mov    [bp-4],eax
  327.     mov    dx,word ptr [bp-2]
  328.     mov    ax,word ptr [bp-4]
  329.     mov    sp,bp
  330.     pop    bp
  331.     ret
  332.  
  333. _compute_slope    endp
  334.  
  335.  
  336.     end
  337.  
  338.  
  339.